如同我們在第一天所說的,這三十天的文章理論上會建出一個有多台伺服器的架構。
當許多台伺服器都有相同需求 (例如要加某個使用者) 或是需要相同設定時,Ansible 就非常有用。
Ansible 的執行原理是透過自動 ssh 登入指定的機器,並下指定的指令,所以他可以避免自己要手動登入多台機器下重複指令的這種瑣事,也減少人為的失誤可能性。
Ansible 是用 Python 寫成的,所以我們可以使用 pip
來安裝。
$ python3 -m pip install --user ansible
以下是一個安裝 vim 和 tmux 的範例:
- name: Task
hosts: workstations
tasks:
- name: Install vim
become: yes
apt:
name: vim
state: present
- name: Install tmux
become: yes
apt:
name: tmux
state: present
這個檔案是一個 YAML 檔,裡面描述了一個 Playbook 的內容,白話來說就是 Ansible 要幫你執行什麼。
他可以隨意命名,這邊我命名為 main.yaml
。
稍微解釋一下這裡面的東西:
apt install vim
和 apt install tmux
,而他們都隸屬於 Task
這個 Play。become=yes
的意思是執行這個 task 的時候要變成 root 的權限,預設的 become 方式是 sudo
。
sudo
可能會造成一些問題的時候就可以考慮改成 become_method=su
。apt
代表了 Ansible 提供的 apt
模組,是 Ansible 幫我們包好的。
state: present
代表他會讓指定的套件存在,就是安裝他的意思。剛剛沒有說明 hosts: workstations
,乍看之下可能會覺得這大概就是 DNS 指向的 workstations
這個 domain,但事實上這是自己定義的。
假設我們現在有 work1
、work2
兩台工作站,那我們就必須在 inventory/hosts.yaml
裡面寫下:
[workstations]
work1
work2
也可以在這邊設定 ssh 需要的參數,例如:
[workstations]
work1 ansible_user=user ansible_ssh_pass=pass
work2 ansible_user=user2 ansible_ssh_pass=pass2
然後在執行 Playbook 的時候,Ansible 就會來這邊查 workstations
代表哪些主機。
我們要指定 Playbook 的檔案及 hosts.yaml
檔案。
$ ansible-playbook -i inventory/hosts.yaml main.yaml --ask-become-pass
如果你要連的機器沒有辦法用 ssh key 直接連線的話,在指令的最後要加上 --ask-pass
,這樣他才會問你 ssh 登入的密碼,不然會直接失敗。
最後的 --ask-become-pass
是會先問你 sudo
密碼 (或是 root 密碼,看你的 become_method
) 是什麼,然後他到時候會使用這個密碼來做 privilege escalation。
執行之後就可以看到他開始跑,他會先嘗試連上機器,然後執行上述的兩個 task,沒意外的話應該會看到綠色的 ok
。
最後看到這樣的東西就是成功了。
Ansible 有很多好玩的功能,這邊只是簡單說明一下而已,如果要用到很多不同的機器,用很多 Playbook 的話,也會有更好的架構 (有興趣的話可以查查看 ansible role
),但就跟上一篇 docker 一樣,只是稍微提一下,讓大家知道有這種好東西可以幫助自己管理伺服器而已。